Modern displays include the ability to provide a three-dimensional (3D) viewing experience. For example, stereoscopic displays achieve a perception of 3D depth by presenting an image for each eye of a viewer. More particularly, similar, but slightly offset depictions of a scene are rendered, one to be viewed by the left eye and one to be viewed by the right eye. The viewer's brain then commingles the images such that a 3D depth to the scene rendered in the image is perceived. Some stereoscopic displays rely on companion glasses that work in conjunction with the display so that each eye is allowed to view the image intended for that eye. For example, the glasses may include filters or shutters that open and close in concert with the display frequency. More complex stereoscopic viewing experiences exist, such as, auto-stereoscopic displays, holographic displays, etc.
Accordingly, stereoscopic techniques require multiple views of each scene. For example, a basic stereoscopic display requires a right eye and a left eye version of each scene. Conventional techniques individually render each view of a particular scene. Said differently, each scene is processed through the rendering pipeline for every necessary view (e.g., right eye, left eye, etc.) Rendering each scene more than once causes significant overhead for graphics processing components and central processing components of a system.
In order to alleviate this burden, some techniques employ a geometry shader to duplicate the geometry of the objects depicted in the scene and transform them for each stereoscopic view. For example, the scene would be processed through the rendering pipeline once, passed to the geometry shader, where the geometry in the scene is duplicated and transformed to produce the multiple views of the scene. Many computing platforms and graphic software applications, however, lack support for geometry shaders. Furthermore, the present of geometry shaders in a rendering pipeline adds computational overhead and complexity above rendering pipelines that do not have geometry shaders. Additionally, as will be appreciated, implementing geometry shaders in hardware is typically much more complex than vertex shaders as geometry shaders have variable output capabilities for fixed inputs whereas vertex shaders have fixed outputs for fixed inputs. As such, scheduling threads for vertex shader is typically simpler than for geometry shaders. Furthermore, implementation and performance of vertex shaders is generally superior to that of geometry shaders.